package com.zrrd.demo01;

import java.util.Arrays;

/**
 * @author WanJl
 * @version 1.0
 * @title MyArray
 * @description 自己实现的一个数组长度可变的数组
 * @create 2024/3/24
 */
public class MyArray {
    //定义一个初始数组长度为0的Object类型数组。
    //要定义为私有的
    private Object[] objs;
    //当我创建对象的时候，构造方法会创建一个长度为0的Object类型数组。
    public MyArray() {
        objs=new Object[0];
    }
    //获取数组长度的方法
    public int size(){
        return objs.length;
    }

    //向数组中添加元素的方法
    public void add(Object obj){
        //新建一个临时的数组
        Object[] tempObjs=new Object[size()+1];
        //把原来数组中的元素赋值到新数组中
        for (int i = 0; i < size(); i++) {
            //把原来数组中的元素赋值给新的数组中
            tempObjs[i]=objs[i];
        }
        //再把要添加的元素放入数组的最后
        tempObjs[size()]=obj;
        //最后用新的数组替换原来的数组
        objs=tempObjs;

    }

    @Override
    public String toString() {
        return Arrays.toString(objs);
    }

    //判断是否为空
    public boolean isEmpty(){
        return size()==0?true:false;
    }

    //根据i的值获取指定位置的元素
    public Object get(int index){
        if (index>=size()){
            throw new ArrayIndexOutOfBoundsException(index);
        }
        return objs[index];
    }

    //根据指定元素获取其所在的位置
    public int get(Object obj){
        if (obj==null){
            throw new NullPointerException("该元素为null");
        }
        for (int i = 0; i < size(); i++) {
            if (objs[i].equals(obj)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 移除数组中最后一个元素，并返回该元素所在位置(索引值)
     * @return
     */
    public int removeLast(){
        //新建一个临时数组
        Object[] tempObjs=new Object[size()-1];
        for (int i = 0; i < tempObjs.length; i++) {
            tempObjs[i]=objs[i];
        }
        //最后用新的数组替换原来的数组
        objs=tempObjs;
        return size();
    }

    /**
     * 移除数组中指定的元素，移除成功后返回该元素对象。
     * @param index
     * @return
     */
    public Object remove(int index){
        if (index>=size()){
            throw new ArrayIndexOutOfBoundsException(index);
        }
        Object e=objs[index];
        //新建一个临时数组
        Object[] tempObjs=new Object[size()-1];
        for (int i = 0; i < tempObjs.length; i++) {
            if (i<index){
                tempObjs[i]=objs[i];
            }else if(i>=index){
                tempObjs[i]=objs[i+1];
            }
        }
        //最后用新的数组替换原来的数组
        objs=tempObjs;
        return e;
    }

}
